package com.atguigu.java2;

import org.junit.Test;

import java.util.Iterator;
import java.util.List;

/**
 * @Description
 * @Author codingBee
 * @Date 2020/6/20/22:04
 * 1.泛型在继承方面的体现
 * 虽然类A是类B的父类，但是G<A>和G<B>二者不具备字符类关系，二者是并列关系
 * 补充：类A是类B的父类，那么A<G>是B<G>的父类
 * 2.通配符的使用
 * 3.有限制条件的通配符的使用
 */
public class GenericTest {
    /**
     * 通配符的使用
     * 通配符 ?
     * 类 A 是类 B的父类，G<A>和G<B>是没有关系的，二者共同的父类是：G<?>
     */
    @Test
    public void test() {
        List<Object> list1 = null;
        List<Object> list2 = null;
        List<?> list = null;
        list = list1;
        list = list2;
//        list.add(2);// 对于List<?>就不能向其内部添加数据，除了null之外
        Object o = list.get(0);//对于List<?>允许读取数，读取的数据类型为Object
    }

    public void print(List<?> list) {
        Iterator<?> iterator = list.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            System.out.println(next);
        }
    }

    /**
     * 3.有限制条件的通配符的使用
     * ? extends Person
     * ? super Person
     */
    public void test3() {
        List<? extends Person> list1 = null;
        List<? super Person> list2 = null;
        List<Student> list3 = null;
        List<Person> list4 = null;
        List<Object> list5 = null;
        list1 = list3;
        list1 = list4;
        //list1 = list5; //编译异常，因为list1 的泛型是要求 Person 或者 Person 的子类
        //list2 = list3; //编译异常，因为list2 的泛型是要是 Person 或者 Person 的父类
        list2 = list4;
        list2 = list5;

        list1 = list3;
        Person person = list1.get(0); //必须是>=Person类的
        Object person2 = list2.get(0);
        list2.add(new Student());//必须是<=Person
    }

}
